package com.hy.service.impl;

import com.hy.entitys.hy_front_userdb.Us_tp;
import com.hy.service.IUs_tpService;
import com.hy.service.FaceService;
import com.hy.utils.HY_Result;
import com.hy.utils.ResultCode;
import com.hy.utils.SaltUtils;
import com.hy.utils.ThirdParty;
import com.hy.utils.face.BaiduAIFace;
import com.hy.utils.face.Setingmodel;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Service;
import org.springframework.util.ObjectUtils;

import java.io.IOException;
import java.util.Map;
import java.util.concurrent.TimeUnit;

/**
 * 百度 - 服务
 * @Author: 是奕靜吖
 */
@Service
public class faceServiceImpl implements FaceService {

    //注入 参数类
    @Autowired
    private Setingmodel sm;

    //百度 API
    @Autowired
    private BaiduAIFace bdAPI;

    //会员签名验证 - 登录 - 业务层
    @Autowired
    private IUs_tpService ius;

    //引入通用类型的redis模板 直接注入即可
    @Autowired
    private RedisTemplate redisTemplate;

    /**
     * 手机号绑定页面
     */
    @Value("${download.Mobile_Binding}")
    private String Mobile_Binding;

    /**
     * 人脸检测
     * @return
     */
    @Override
    public HY_Result facefaceDetect(StringBuffer image_Bast64) {
        //传入图片
        sm.setImgpath(image_Bast64.toString());
        Map<String,Object> fdmap = bdAPI.facefaceDetect(sm);
        if (ObjectUtils.isEmpty(fdmap)){
            //识别异常
            return HY_Result.SERVER_ERROR();
        }else if ("SUCCESS".equals(fdmap.get("error_msg"))){
            //有人脸
            return new HY_Result(ResultCode.SUCCESS,image_Bast64);
        }
        //无人脸
        return HY_Result.FAILURE();
    }

    /**
     * 人脸绑定
     * @param image_Bast64
     * @return
     */
    @Override
    public HY_Result faceBinding(StringBuffer image_Bast64) throws IOException {
        HY_Result rs = facefaceDetect(image_Bast64);
        if (rs.isSuccess()){
            //检测到人脸
            //查询哪一组
            sm.setGroupID("YJ");
            //传入图片
            sm.setImgpath(image_Bast64.toString());
            //人脸查询
            Map<String, Object> fc = bdAPI.faceSearch(sm);
            //判断是否 查询到该用户
            if (!ObjectUtils.isEmpty(fc) && fc.get("error_msg").equals("SUCCESS")){
                //相似度
                String score = fc.get("score").toString();
                if (Integer.valueOf(score) > 80){
                    //已存在
                    return HY_Result.USER_ALREADY();
                }
                //去绑定页面
                //赋予 第三方信息
                ThirdParty tp = new ThirdParty();
                //登录类型
                tp.setSource("FACE");
                //图片 Base64
                tp.setAvatar(image_Bast64.toString());
                //生成7位随机字符串
                String salt = SaltUtils.getSalt(7);
                //存储5分钟
                redisTemplate.opsForValue().set("ql"+salt,new HY_Result(ResultCode.SUCCESS,tp),5L, TimeUnit.MINUTES);
                //Go绑定手机号页面
                return new HY_Result(ResultCode.SUCCESS,tp,Mobile_Binding+salt);
            }
            //异常
            return HY_Result.SERVER_ERROR();
        }
        //无人脸
        return HY_Result.FACE_IDENTIFY_ERROR();
    }

    /**
     * 人脸注册
     * @param sg
     * @return
     * @throws IOException
     */
    @Override
    public HY_Result faceRegistration(Setingmodel sg) throws IOException {
        Map<String,Object> rgmap = bdAPI.faceRegistration(sg);
        if (!ObjectUtils.isEmpty(rgmap)){
            if (!ObjectUtils.isEmpty(rgmap) && rgmap.get("error_msg").equals("SUCCESS")){
                //人脸注册成功
                return HY_Result.SUCCESS();
            }
            //人脸注册失败
            return HY_Result.FAILURE();
        }
        //识别异常
        return HY_Result.SERVER_ERROR();
    }

    /**
     * 删除 人脸
     * @param image_Bast64
     * @return
     */
    @Override
    public Map<String,Object> delPersonFace(StringBuffer image_Bast64) throws IOException {
        //查询某组名的人脸
        sm.setGroupID("YJ");
        //传入图片
        sm.setImgpath(image_Bast64.toString());
        Map<String,Object> fc = bdAPI.faceSearch(sm);
        //判断是否 查询到该用户
        if (!ObjectUtils.isEmpty(fc) && !ObjectUtils.isEmpty(fc.get("user_id"))){
            //相似度  (去除小数位)
            String score = fc.get("score").toString();
            if (score.indexOf('.') == -1){
                if (Integer.valueOf(score) > 80){
                    //根据人脸查询出用户id
                    String user_id = fc.get("user_id").toString();
                    //用户id
                    sm.setUserID(user_id);
                    //返回删除 结果
                    return bdAPI.delPersonFace(sm);
                }
            }else{
                if (Integer.valueOf(score.split(".")[0]) > 80){
                    //根据人脸查询出用户id
                    String user_id = fc.get("user_id").toString();
                    //用户id
                    sm.setUserID(user_id);
                    //返回删除 结果
                    return bdAPI.delPersonFace(sm);
                }
            }
        }
        return null;
    }

    /**
     * 更新人脸
     * @param image_Bast64 参数设置
     * @return
     */
    @Override
    public Map<String,Object> faceUpdate(StringBuffer image_Bast64) throws IOException {
        //查询某组名的人脸
        sm.setGroupID("YJ");
        //传入 新图片 图片
        sm.setImgpath(image_Bast64.toString());
        Map<String,Object> fc = bdAPI.faceSearch(sm);
        //判断是否 查询到该用户
        if (!ObjectUtils.isEmpty(fc) && !ObjectUtils.isEmpty(fc.get("user_id"))){
            //相似度  (去除小数位)
            String score = fc.get("score").toString();
            if (score.indexOf('.') == -1){
                if (Integer.valueOf(score) > 80){
                    //根据人脸查询出用户id
                    String user_id = fc.get("user_id").toString();
                    //用户id
                    sm.setUserID(user_id);
                    //返回更新结果
                    return bdAPI.faceUpdate(sm);
                }
            }else{
                if (Integer.valueOf(score.split(".")[0]) > 80){
                    //根据人脸查询出用户id
                    String user_id = fc.get("user_id").toString();
                    //用户id
                    sm.setUserID(user_id);
                    //返回更新结果
                    return bdAPI.faceUpdate(sm);
                }
            }
        }
        return null;
    }

    /**
     * 人脸查找
     * @param image_Bast64
     * @return
     * @throws IOException
     */
    @Override
    public HY_Result faceSearch(StringBuffer image_Bast64) throws IOException {
        HY_Result rs = facefaceDetect(image_Bast64);
        if (rs.isSuccess()){
            //查询某组名的人脸
            sm.setGroupID("YJ");
            //传入图片
            sm.setImgpath(image_Bast64.toString());
            Map<String, Object> fc = bdAPI.faceSearch(sm);
            //判断是否 查询到该用户
            if (!ObjectUtils.isEmpty(fc) && fc.get("error_msg").equals("SUCCESS")) {
                //相似度
                String score = fc.get("score").toString();
                if (Integer.valueOf(score) > 80) {
                    String user_id = fc.get("user_id").toString();
                    Us_tp ut = new Us_tp();
                    ut.setUsTpTid(5);
                    ut.setUsTpSign(user_id);
                    return ius.Ut_JWT_Token(ut);
                }
                //人脸识别失败
                return HY_Result.FACE_IDENTIFY_ERROR();
            }
            //未找到 先注册
            return HY_Result.USER_THERE();
        }
        //无人脸
        return HY_Result.FACE_IDENTIFY_ERROR();
    }

    /**
     * 根据组名获取用户列表
     * @param group
     * @return
     */
    @Override
    public Map<String,Object> findPersonFaceList(String group) {
        //获取本组 所有的用户信息 (默认值100，最大值1000)
        sm.setGroupID(group);
        return bdAPI.findGroupList(sm);
    }
}